<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
//     console.log(Array.prototype.slice) // [Function:slice]
// console.log(Array.prototype[Symbol.iterator]) // [Function:values]

// var obj = {}
// obj.a = 100
// obj[Symbol.iterator] = 200
// console.log(obj)

// var item;

// for(item of [100,200,300]) {
//     console.log(item)
// }

// const arr = [100,200,300]

// const iterator = arr[Symbol.iterator]() // 通过执行[Symbol.iterator] 的属性值（函数），来返回一个 iterator 对象
// console.log(iterator)

// console.log(iterator.next()) // {value: 100,done:false}
// console.log(iterator.next()) // {value: 200,done:false}
// console.log(iterator.next()) // {value: 300,done:false}
// console.log(iterator.next()) // {value: undefind,done:true}

// let i;

// for (i of iterator) {
//     console.log(i)
// }

// function * Hello () {
//     yield 100
//     yield (function () { return 200 })()
//     return 300
// }

// const h = Hello()
// console.log(h[Symbol.iterator]) //[function:[Symbol.iterator]]

// console.log(h.next())  // { value: 100, done: false }
// console.log(h.next())  // { value: 200, done: false }
// console.log(h.next())  // { value: 300, done: false }
// console.log(h.next())  // { value: undefined, done: true }

// let i ;
// for(i of h) {
//     console.log(i)
// }

// function* G () {
//     const a = yield 100;
//     console.log('a', a)   
//     const b = yield 200;
//     console.log('b',b)
//     const c= yield 300;
//     console.log('c',c)
// }
// const g = G()
// console.log(g.next() )   // value: 100, done: false
// g.next('aaa') // 
// g.next('bbb') // 
// g.next('ccc') // 
// g.next('ddd') // 

// function* G() {
//     const a = yield 100
//     console.log('a', a)  // a aaa
//     const b = yield 200
//     console.log('b', b)  // b bbb
//     const c = yield 300
//     console.log('c', c)  // c ccc
// }
// const g = G()
// g.next()    // value: 100, done: false
// console.log(g.next('aaa') )// value: 200, done: false
// g.next('bbb') // value: 300, done: false
// console.log(g.next('ccc') )// value: undefined, done: true

// function* fibonacci() {
//     let [prev,curr] = [0,1]
//     for(;;) { //是无条件循环，就是说它是无限循环的。
//         [prev,curr] = [curr ,prev + curr]
//          // 将中间值通过 yield 返回，并且保留函数执行的状态，因此可以非常简单的实现 fibonacci
//          yield curr
//     }
// }

// for(let n of fibonacci()) {
//     if(n > 1000) {
//         break
//     }
//     console.log(n)
// }

function* G1() {
    yield 'a'
    yield* G2()
    yield 'b'
}
function* G2() {
    yield 'x'
    yield 'y'
}
for(let item of G1()) {
    console.log(item)
}
</script>
</html>